package com.witmore.neutron.ai.web.apiv2.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jk.common.response.ResponsePageResult;
import com.jk.common.response.ResponseResult;
import com.witmore.neutron.ai.db.entity.ProviderProfileDO;
import com.witmore.neutron.ai.web.annotation.RequiresPermission;
import com.witmore.neutron.ai.web.apiv2.controller.vo.*;
import com.witmore.neutron.ai.web.filter.GlobalAccountSession;
import com.witmore.neutron.ai.web.service.ProviderProfileService;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * V2 服务商信息相关接口
 * Author: 豆子高
 * Date: 2025/09/01
 */
@Slf4j
@RestController
@RequestMapping("/v2/provider")
public class ProviderProfileControllerV2 {

    @Autowired
    private ProviderProfileService providerProfileService;

    private void superAdminCheck() {
        Boolean isSuperAdmin = GlobalAccountSession.getUserInfo().getIsSuperAdmin();
        if (isSuperAdmin == null || !isSuperAdmin) {
            throw new RuntimeException("无权限");
        }
    }


    /**
     * 用户提交创建服务商
     */
    @RequiresPermission("provider:user:submit")
    @PostMapping("/create/user")
    public ResponseResult<Void> createProviderByUser(@Valid @RequestBody ProviderProfileUserCreateParam createParam) {
        log.info("用户创建服务商请求: {}", createParam);
        return providerProfileService.createProviderByUser(createParam);
    }

    /**
     * 审核服务商  超级管理员管理后台使用此接口
     */
    @RequiresPermission("provider:audit")
    @PostMapping("/audit")
    public ResponseResult<Void> auditProvider(@Valid @RequestBody ProviderAuditParam auditParam) {
        log.info("审核服务商请求: {}", auditParam);
        this.superAdminCheck();
        return providerProfileService.auditProvider(auditParam);
    }

    /**
     * 管理员创建服务商  超级管理员管理后台使用此接口
     */
    @RequiresPermission("provider:admin:submit")
    @PostMapping("/create/admin")
    public ResponseResult<Void> createProviderByAdmin(@Valid @RequestBody ProviderProfileAdminCreateParam createParam) {
        log.info("管理员创建服务商请求: {}", createParam);
        this.superAdminCheck();
        return providerProfileService.createProviderByAdmin(createParam);
    }

    /**
     * 更新服务商
     */
    @RequiresPermission("provider:update")
    @PostMapping("/update")
    public ResponseResult<Void> updateProvider(@Valid @RequestBody ProviderProfileUpdateParam updateParam) {
        log.info("更新服务商请求: {}", updateParam);
        return providerProfileService.updateProvider(updateParam);
    }

    /**
     * 删除服务商  超级管理员管理后台使用此接口
     */
    @RequiresPermission("provider:delete")
    @PostMapping("/{id}")
    public ResponseResult<Void> deleteProvider(@PathVariable("id") Integer id) {
        log.info("删除服务商请求: {}", id);
        this.superAdminCheck();
        return providerProfileService.deleteProvider(id);
    }

    /**
     * 根据ID获取服务商详情
     */
    @RequiresPermission("provider:detail")
    @GetMapping("/{id}")
    public ResponseResult<ProviderProfileDO> getProviderById(@PathVariable("id") Integer id) {
        log.info("查询服务商详情请求: {}", id);
        return providerProfileService.getProviderById(id);
    }

    /**
     * 分页查询服务商列表 超级管理员管理后台使用此接口
     */
    @RequiresPermission("provider:list")
    @GetMapping("/list")
    public ResponsePageResult<ProviderProfileDO> getProviderList(ProviderProfileQueryParam queryParam) {
        log.info("分页查询服务商列表请求: {}", queryParam);
        try {
            this.superAdminCheck();
            Page<ProviderProfileDO> page = providerProfileService.getProviderPage(queryParam);
            return ResponsePageResult.success(page);
        } catch (Exception e) {
            log.error("分页查询服务商列表异常", e);
            return ResponsePageResult.fail(500, "查询失败：" + e.getMessage());
        }
    }

    /**
     * 分页查询服务商员工列表
     */
    @RequiresPermission("provider:employee:list")
    @GetMapping("/employee/list")
    public ResponsePageResult<ProviderEmployeeResult> getProviderEmployeeList(ProviderEmployeeQueryParam queryParam) {
        log.info("分页查询服务商员工列表请求: {}", queryParam);
        try {
            return providerProfileService.getProviderEmployeePage(queryParam);
        } catch (Exception e) {
            log.error("分页查询服务商员工列表异常", e);
            return ResponsePageResult.fail(500, "查询失败：" + e.getMessage());
        }
    }
}
